\chapter{Introdução}
\label{cap:introducao}
Em um cenário no qual a maior parte do processamento computacional é
realizado por servidores locais e {\it data centers} proprietários, onde o
poder de processamento computacional nem sempre é utilizado por completo,
paga-se por energia, manutenção e tecnologias que podem não ser usadas em
sua totalidade. Neste contexto, surgiu a ideia de que, em vez de pagar por uma
estrutura proprietária, de manutenção cara, que às vezes fica ociosa, fosse
utilizada uma estrutura que usasse os seus recursos de acordo com a necessidade
de cada usuário. Assim, os recursos seriam alocados de acordo com a demanda de
utilização necessária. Essa é a chamada computação sob demanda, cuja a grande
vantagem é que encerra o cenário onde o usuário é obrigado a
manter e pagar por uma infraestrutura que não é usada em sua totalidade sempre.

Nesse cenário, surge a plataforma de computação em nuvem, a qual busca reduzir o
custo computacional, aumentar a confiabilidade e a flexibilidade para
transformar computadores de tal forma que todo o tratamento dos dados e
aplicações são vistos como um serviço~\cite{buyya2010}. O
objetivo é que a computação em nuvem disponibilize um serviço totalmente
sob demanda, em que para todos os processamentos solicitados, sejam alocados recursos de
acordo com a necessidade, e que esse processo seja totalmente dinâmico,
oferecendo poder computacional somente na medida necessária.

Atualmente, é possível encontrar alguns serviços de nuvens públicas por meio de
empresas como a Amazon~\cite{amazon2012}, a Microsoft~\cite{microsoft2012} e a
Google~\cite{googleappengine2013}. Em sistemas de
computação em nuvem, diferentes fundamentos estão presentes, tais como
a virtualização, a escalabilidade, a interoperabilidade, a qualidade de serviço (QoS),
os mecanismos sobre falhas e os modelos de entrega de nuvens (privadas, públicas
e híbridas). Os três principais tipos de serviços de nuvens disponibilizados são
os de software (SaaS), de infraestrutura (IaaS) e de plataforma (PaaS) como serviços.
	
Como a quantidade de dados a ser processada aumenta cada vez mais no mundo
da computação, seja em processos de aplicações ou no próprio armazenamento de
dados, surge a necessidade de ter um poder de processamento e armazenamento cada
vez maior, que possa atender pedidos em um tempo hábil, de modo automático e dinâmico.
Porém, uma nuvem possui recursos limitados, e por conta disso surgiu a ideia de
se integrar nuvens. O objetivo é aumentar os recursos disponíveis, pois se um
recurso de uma nuvem se esgotar, uma outra nuvem pode utilizar os seus recursos
caso estejam disponíveis. Dessa ideia emergiu o conceito de Federação de Nuvens.
	
As federações de nuvens são conjuntos de nuvens que possuem todos os seus recursos
gerenciados por meio de uma interface conectada a todas elas, de forma que se
uma nuvem não tiver recursos para determinado processamento, uma outra nuvem que
esteja com recursos disponíveis no momento possa realizar este processamento.

Nesse cenário, Hugo et al.~\cite{bionimbusbook} propuseram uma arquitetura de
federação de nuvens chamada BioNimbus, simples e dinâmica, que pode executar
diferentes aplicações dentro da federação. Atualmente, ela vem sendo utilizada
para a execução de {\it workflows} de bioinformática, mas nada impede que seja
usada para outras aplicações. Dentre os objetivos do BioNimbus estão integrar e
controlar diferentes provedores de infraestrutura, oferecendo um serviço
flexível e tolerante a falhas.
Neste trabalho, fizemos várias modificações na estrutura original do BioNimbus,
em especial, foi realizada a integração do ZooKeeper Apache~\cite{zookeeper2010}
e do Avro Apache~\cite{avro2012}. Como consequência, este passou a ser chamado
de ZooNimbus, embora continue a prover uma plataforma que
disponibiliza uma federação em nuvem que executa serviços de bioinformática
com recursos heterogêneos, públicos ou privados.

Todavia, como o ZooNimbus não tinha uma política de armazenamento de dados
definida, o objetivo deste trabalho é propor uma política de armazenamento para
a plataforma de federação ZooNimbus, de tal forma que o {\it makespan} das
tarefas executadas no ambiente federado seja minimizado.

	\section{Motivação}
	
A federação de nuvens tem se mostrado uma plataforma capaz de integrar diferentes
infraestruturas, proporcionando uma maior flexibilidade na escolha de provedores
e uma visão na qual a quantidade de armazenamento e processamento passe a ideia
para o usuário de que esses recursos são ilimitados, porém não existe uma
padronização para a tecnologia de integração com outras nuvens.
		
Uma arquitetura de federação de nuvens computacionais híbridas para execução de
{\it workflows} de bioinformática, denominada BioNimbus, foi implementada para
tentar alcançar essa padronização, mas essa arquitetura não possui uma política
para o armazenamento de dados, utilizando, uma forma aleatória de alocação de
dados. Isto faz com que as aplicações executadas no BioNimbus tenham um
desempenho baixo.

Neste cenário, a motivação deste trabalho é melhorar o tempo de execução total
de aplicações executadas no ambiente de nuvens federadas BioNimbus, por meio de
uma escolha correta do melhor recurso para armazenar arquivos de entrada e saída
vindos destas aplicações.

\section{Problema}
Atualmente, não existe uma política de armazenamento eficiente no
BioNimbus. Assim, os arquivos são armazenados em qualquer recurso no qual o
cliente se conecta de forma aleatória. Como consequência, o ZooNimbus:
			
\begin{itemize}
	\item  Não possui política de armazenamento de dados implementada;
	\item  Não realiza operações com os seus dados, tais como redundância,
		   replicação, tolerância a falhas, backups, etc;
	\item  Os dados armazenados não são gerenciados pelo módulo de armazenamento.
\end{itemize}
			 					
	\section{Objetivos}
	
		\subsection{Principal}
		
Implementar uma política de armazenamento de dados na arquitetura de federação
em nuvens ZooNimbus, para que os dados armazenados na federação sejam tratados
de forma a otimizar o desempenho na execução das tarefas e na plataforma de
federação em nuvens.

		\subsection{Específicos}
Para cumprir o objetivo principal, este trabalho tem os seguintes objetivos
específicos:
\begin{itemize}
  \item Realizar um estudo de caso com os arquivos do BioNimbus para testar o
  desempenho no armazenamento dos arquivos na nuvem;
  \item Utilizar o Apache Avro e Apache Zookeeper para implementar uma política
  de armazenamento para os arquivos do BioNimbus;
  \item Implementar uma política de armazenamento no BioNimbus;
  \item Discutir os resultados obtidos com a política de
  armazenamento definida para o BioNimbus.
\end{itemize}	

	\section{Estrutura do Trabalho}
Este trabalho está divido em seis capítulos. No
Capítulo~\ref{cap:computacao_nuvem} será apresentado conceitos e
característicias de computação em nuvem, abordando a limitação que a nuvens
possuem. E diante dessa questão, surge o conceito de integrar várias nuvens, as
chamadas federações de nuvens.  Mostrando que as federações integram as nuvens,
não importando o seu tipo. Abordando também conceitos e exemplos de um dos
temas mais discutidos nas federações de nuvens, o armazenamento em nuvem.

No Capítulo~\ref{cap:bionimbus_zoonimbus}, é apresentado a arquitetura de
federação de nuvens proposta por Hugo Saldanha~\cite{hugo2012}, o BioNimbus,
integrando os programas da Apache, o Apache Zookeeper e o Apache
Avro, uma nova versão do BioNimbus surge, o ZooNimbus.

No Capítulo~\ref{cap:politica} será mostrado as mudanças que ocorreram com a
implementação do ZooNimbus em relação aos serviços que o BioNimbus implementava,
e por fim é demonstrado o algoritmo utilizado na implementação
da política de armazenamento, o ZooClouS, que foi baseado no Algoritmo
A*~\cite{xun2010}, proposto para o ambiente de computação em nuvem em conjunto
com as modificações sofridas no serviço de armazenamento.

No Capítulo~\ref{cap:casodeuso} é descrito os resultados obtidos com a
implementação da política, em relação ao tempo de transferência de
arquivos, transferindo os arquivos do ZooNimbus de forma aleatória, como estava
sendo feito no BioNimbus, e transferindo os dados do ZooNimbus com o ZooClouS,
observando também a localidade de onde o arquivo seria armazenado a partir do
referencial, cliente.  Por último, são apresentados testes que comprovam que
quanto maior a quantidade de recursos disponíveis mais rápido as tarefas serão
executadas.

No Capítulo~\ref{cap:conclusao} são apresentadas as conclusões obtidas com a
realização deste trabalho, assim como os trabalhos futuros, no qual pode ajudar
a melhorar a arquitetura de forma exponencial.
